package com.doit.day02

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author:
 * @WX: 17710299606
 * @Tips: 学大数据 ,到多易教育
 * @DOC: https://blog.csdn.net/qq_37933018?spm=1000.2115.3001.5343
 * @Description:
 */
object Demo02MappartitionWithIndex {

  def main(args: Array[String]): Unit = {
       val  conf  = new SparkConf()
             .setMaster("local[*]")
             .setAppName(this.getClass.getSimpleName)
           val sc = SparkContext.getOrCreate(conf)
    val ls = List[Int] (1,2,3,4,5,6,7,8,9)
    // rdd
    val rdd = sc.parallelize(ls , 5) //  ( 0 untion 5)->  i*len / 5   = a
                                                 //   (i+1)*len/5 = b  -> (a,b)
    println(rdd.getNumPartitions)
    //rdd.mapPartitions(每个任务的所有数据=>)
    val res:RDD[(Int , Int)] = rdd.mapPartitionsWithIndex((p, iter) => {
      // p  当前分区号
      // iter 当前处理分区对应的迭代器
      iter.map(e => (p, e))
    })

    res.foreach(println)

    /**
     * RDD分区个数如何决定  ,数据如何划分
     * 本地集合RDD
     *     1. 分区个数   创建时指定   如果不指定所有可用资源核数
     *     2. 数据分配  通过底层的计算逻辑 : 本质就是将并行化的集合 通过 集合中slice方法切片封装成分区信息
     *     [(0 , (0 , 4)) |  (1 , (4,9)) ]
     *
     * 加载文件RDD
     */


    sc.stop()

  }

}
